package com.powernode.settings.service.impl;

import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.powernode.commons.utils.DateUtils;
import com.powernode.commons.utils.MD5Util;
import com.powernode.commons.utils.ResponseData;
import com.powernode.commons.utils.UUIDUtils;
import com.powernode.settings.bean.UserBean;
import com.powernode.settings.dao.UserMapper;
import com.powernode.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.Date;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper dao;

    /**
     * 查询所有
     * @return
     */
    @Override
    public ResponseData findAll() {
        return ResponseData.ok(dao.selectAll());
    }

    /**
     * 登录
     * 思路:
     * 1. 先判断验证码是否为空
     * 2. 如果不为空,与session的真实的验证码比对
     * 3. 如果比对成功
     * 4. 根据账户名和密码查表  ,注意前端传递的是密码的明文,需要加密之后与表中密码比对
     * @param act
     * @param psw
     * @param code
     * @param session
     * @return
     */
    @Override
    public ResponseData login(String act, String psw, String code, HttpSession session) {
        //1.验证码为空
        if (StrUtil.isEmpty(code)){
            return ResponseData.error("验证码不能为空");
        }
        //2.真实验证码
        String realCode= (String) session.getAttribute("code");
        if (!StrUtil.equals(code,realCode,true)){
            return ResponseData.error("验证码输入有误");
        }

        UserBean user = dao.selectByActAndPsw(act, MD5Util.getMD5(psw));
        //判断密码是否正确
        if (null==user){
            return ResponseData.error("用户名或者密码错误");
        }
        //判断用户名是否过期,过期时间为空,代表永久有效
        if (!StrUtil.isEmpty(user.getExpireTime())){
            Date expireDate= DateUtils.parseDate(user.getExpireTime());
            //比较过期时间和当前时间
            if (expireDate.compareTo(new Date())<0){//账号过期
                return ResponseData.error("账号过期,请联系管理员");
            }
        }

        //判断账号有无被锁定
        if(!user.getLockState().equals("1")){//被锁定
            return ResponseData.error("账号被锁定,请联系管理员");
        }

        session.setAttribute("user",user);
        user.setLoginPwd(null);//往前端响应的时候不能将敏感的密码响应出去
        return ResponseData.ok("登录成功",user);
    }

    /**
     * 根据主键修改密码
     * 1. 先根据主键查询原始密码
     * 2. 判断oldPsw 加密之后与表中的密码比对
     * 3. 如果比对成功,可以修改
     * @param id
     * @param oldPsw
     * @param newPsw
     * @return
     */
    @Override
    public ResponseData modifyPswById(String id, String oldPsw, String newPsw) {

        UserBean user = dao.selectByPrimaryKey(id);
        if (!StrUtil.equals(user.getLoginPwd(),MD5Util.getMD5(oldPsw))){
           return ResponseData.error("原始密码错误");
        }
        int row = dao.updatePswById(id, MD5Util.getMD5(newPsw));
        //修改成功
        if (row>0){
            return ResponseData.ok();
        }
        return ResponseData.error();
    }

    /**
     * 分页显示用户
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public ResponseData page(Integer pageNum, Integer pageSize) {
        Page<UserBean> page = PageHelper.startPage(pageNum, pageSize);
        dao.selectAll();
        return ResponseData.ok(page.getResult(),page.getTotal());
    }

    /**
     * 根据主键修改锁定状态
     * @param id
     * @param state
     * @return
     */
    @Override
    public ResponseData modifyLockStateById(String id, String state) {
        int row = dao.updateLockStateById(id, state);
        if (row>0){
            return ResponseData.ok();
        }
        return ResponseData.error();
    }

    /**
     * 添加
     * 1. 先检测用户名是否已存在
     * 2. 如果存在不能添加
     * @param user
     * @return
     */
    @Override
    public ResponseData add(UserBean user) {
        UserBean act = dao.selectLoginAct(user.getLoginAct());
        //先检测用户名是否已存在
        if (null!=act){
            return ResponseData.error("账号已存在");
        }
        //设置主键
        user.setId(UUIDUtils.getUUID());
        user.setLoginPwd(MD5Util.getMD5(user.getLoginPwd()));
        user.setCreateTime(DateUtils.formatDateTime(new Date()));
        int row = dao.insertSelective(user);
        if (row>0){
            return ResponseData.ok();
        }
        return ResponseData.error();
    }

    /**
     * 修改
     * 注意:
     * 1. 判断用户名是否修改了
     * 2. 如果修改了,再去判断用户名是否已存在
     * 3. 再判断密码是否已修改,
     * 4. 如果密码改了,重新加密
     * @param user
     * @return
     */
    @Override
    public ResponseData modify(UserBean user) {
        //查询原始数据
        UserBean oldUser = dao.selectByPrimaryKey(user.getId());
        //判断用户名是否修改了
        if (!StrUtil.equals(oldUser.getLoginAct(),user.getLoginAct())){
            //如果修改了,检测修改之后的用户名是否已存在
            UserBean act = dao.selectLoginAct(user.getLoginAct());
            if (null!=act){
                return ResponseData.error("账号已存在");
            }
        }

        //如果传递密码.判断,密码有无修改,
        if (!StrUtil.equals(oldUser.getLoginPwd(),user.getLoginPwd())){
            //如果改了,加密新密码
            user.setLoginPwd(MD5Util.getMD5(user.getLoginPwd()));
        }
        //设置修改时间
        user.setEditTime(DateUtils.formatDateTime(new Date()));
        int row = dao.updateByPrimaryKeySelective(user);
        if (row>0){
            return  ResponseData.ok();
        }
        return ResponseData.error();
    }


}
